package 字节码文件.方法调用与返回指令;

import java.util.Date;

/**
 * <P> @Author: ideaAdmin
 * <P> TODO: Class
 * <P> TODO: 方法的调用与返回指令
 * <P> Date: 2022/3/27:14:58
 * <P> Description:
 */

public class MethodInvokeReturnTest {

    //方法调用指令: invokespecial :静态分配
    public void invoke1(){
        //情况1:类实例构造方法<init>()
        Date date = new Date();


        //情况2:指定父类的方法
        super.toString();

        //情况3:私有方法
        methodPrivate();
    }
    private void methodPrivate(){}

    //方法调用指令 invokestatic :静态分配
    public void invoke2(){
        methodStatic();
    }

    public static void methodStatic(){}

    //方法调用指令 invokeinterface
    public void invoke3(){
        Thread t1 = new Thread();
        ((Runnable)t1).run();

        Comparable<Integer> com = null;
        com.compareTo(123);
    }

    // 调用指令：invokevirtual 动态分派
    public void invoke4(){
        System.out.println("hello");

        Thread t1 = null;
        t1.run();
    }

    /**
        * TODO:方法返回指令
    **/
    public int returnInt(){
        int i = 500;
        return i;
    }

    public double returnDouble(){
        return 0.0;
    }

    public String returnString(){
        return "hello";
    }

    public int[] returnArr(){
        return null;
    }

    /**
        * TODO: 0 bipush 10
             * 2 istore_1
             * 3 iload_1
             * 4 i2f
             * 5 freturn
    **/
    public float returnFloat(){
        int i = 10;
        return i;
    }

    public byte returnByte(){
        return 0;
    }

    /**
        * TODO:0 aload_0
            * 1 invokevirtual #16 <字节码文件/方法调用与返回指令/MethodInvokeReturnTest.returnByte : ()B>
            * 4 istore_1
            * 5 return
    **/
    public void methodReturn(){
        int i = returnByte();
    }

}
